package java16;

import java.util.Objects;

public class RecordSample {

    // 成员类型(静态内部类可以被外部访问)
    public record Mail2(String title, String body) {

        // 构造函数 public 类名 {} 代码体的逻辑会插到自动生成的全参构造函数内部的前面
        // public Mail2(String title, String body) {
        //     Objects.requireNonNull(title);
        //     Objects.requireNonNull(body);
        //     this.title = title;
        //     this.body = body;
        // }
        // 编译后相当于如上
        public Mail2 {
            Objects.requireNonNull(title);
            Objects.requireNonNull(body);
        }

        // 只可以定义静态属性的字段
        static int id;

        // 可以定义静态的方法
        public static int autoGeneratedId() {
            return 1;
        }

        // 可以定义普通的方法
        public int getOrDefaultId() {
            return id <= 0 ? 1 : id;
        }

    }

    public static void main(String[] args) {
        // =================================
        // Record 记录类型
        // 1、用于传输不可变的数据。该类型没有setter方法、类和字段及方法都是final修饰，是线程安全的
        // 2、编译器会编译生成含所有参数的构造函数、和字段名同名的方法名、hashCode、equals、toString
        // 3、Record类型可以单独作为一个文件(顶级类)、成员类型(静态内部类)、局部类型/方法内部的类型(静态内部类仅能被该方法访问)
        // 4、Record类型内部只能定义static的静态属性字段, 可以定义静态或非静态的普通方法
        // =================================

        // 局部类型/方法内部的类型(静态内部类仅能被该方法访问)
        record Mail3(String title, String body) {

        }

        Mail1 mail1 = new Mail1("Java 16 for mail1", "Record type of new feature");
        Mail2 mail2 = new Mail2("Java 16 for mail2", "Record type of new feature");
        Mail3 mail3 = new Mail3("Java 16 for mail3", "Record type of new feature");
        System.out.println(mail1.title());
        System.out.println(mail1.body());
    }

}